/* 478. 在圆内随机生成点 */
/**
 * @param {number} radius
 * @param {number} x_center
 * @param {number} y_center
 */

// 暴力
var Solution = function (radius, x_center, y_center) {
	this.radius = radius
	this.x_center = x_center
	this.y_center = y_center
}

/**
 * @return {number[]}
 */
Solution.prototype.randPoint = function () {
	const { x_center, y_center, radius } = this
	const max_x = x_center + radius
	const min_x = x_center - radius
	const max_y = y_center + radius
	const min_y = y_center - radius

	let x, y
	while (true) {
		x = this.getRandom(min_x, max_x)
		y = this.getRandom(min_y, max_y)
		const ans = (x - x_center) ** 2 + (y - y_center) ** 2
		if (ans <= radius * radius) break
	}
	return [x, y]
}
Solution.prototype.getRandom = function (min, max) {
	return Math.random() * (max - min + 1) + min
}
/* 
    拒绝采样
    我们在一个更大的范围内产生随机数，并拒绝掉那些不在题目给定范围内的随机数，
    此时保留下来的随机数都在范围内，为了在一个半径为r的圆中随机生成点，我们可以使用一个边长
    为2R的正方形覆盖住圆，并在正方形内生成均匀随机点，此时就只需要对横坐标和纵坐标分别生成
    一个随机数即可
*/
var Solution = function (radius, x_center, y_center) {
	this.r = radius
	this.xc = x_center
	this.yc = y_center
}

/**
 * @return {number[]}
 */
Solution.prototype.randPoint = function () {
	while (true) {
		/* Math.random() * (2 * this.r) 计算的是在[0,2r)的范围内随机数 */
		const x = Math.random() * (2 * this.r) - this.r
		const y = Math.random() * (2 * this.r) - this.r
		/* 判断(x-a)² + (y - b)² <= r² 即在圆内 */
		if (x * x + y * y <= this.r * this.r) {
			return [this.xc + x, this.yc + y]
		}
	}
}

const solution = new Solution(1, 0, 0)
